Learn in 10 minutes

Learn in 10 minutes

Aprende Java en 10 minutos

Java es un lenguaje de programación de alto nivel y orientado a objetos conocido por su principio de “escribir una vez, ejecutar en cualquier lugar”. Este tutorial cubre las características de Java 21+ y te ayuda a aprender rápidamente los fundamentos de Java.

1. Escribiendo tu primer programa Java

Los programas Java se organizan en clases. Comencemos con un programa simple. Crea un archivo llamado HelloWorld.java:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("¡Hola, Mundo!");
    }
}

Compila y ejecuta el programa:

javac HelloWorld.java
java HelloWorld

La salida será:

¡Hola, Mundo!

Este programa simple demuestra la estructura básica de Java. Cada programa Java debe tener al menos una clase, y el método main es el punto de entrada.

2. Sintaxis básica

La sintaxis de Java es estructurada y sigue reglas específicas:

// Este es un comentario de una línea
/* Este es un 
   comentario de múltiples líneas */

public class BasicSyntax {
    public static void main(String[] args) {
        System.out.println("¡Hola, Java!");
    }
}

Reglas básicas de sintaxis en Java:

  • Sensible a mayúsculas: Java distingue entre mayúsculas y minúsculas. Variable y variable son diferentes.
  • Nombres de clase: Deben comenzar con una letra mayúscula y seguir la convención CamelCase.
  • Nombres de método: Deben comenzar con una letra minúscula y seguir la convención camelCase.
  • Punto y coma: Cada declaración debe terminar con un punto y coma ;.
  • Llaves: Los bloques de código se definen usando llaves {}.
  • Comentarios: Los comentarios de una línea usan //, los comentarios de múltiples líneas usan /* */.

3. Variables y tipos de datos

Java es un lenguaje de tipado estático, lo que significa que debes declarar los tipos de variables explícitamente.

Reglas para nombrar variables:

  • Debe comenzar con una letra, guión bajo _ o símbolo de dólar $.
  • Puede contener letras, dígitos, guiones bajos y símbolos de dólar.
  • No puede ser una palabra clave de Java.
  • Debe seguir la convención camelCase.

Tipos de datos primitivos de Java:

  • byte: Entero con signo de 8 bits (-128 a 127)
  • short: Entero con signo de 16 bits (-32,768 a 32,767)
  • int: Entero con signo de 32 bits (-2^31 a 2^31-1)
  • long: Entero con signo de 64 bits (-2^63 a 2^63-1)
  • float: Punto flotante de 32 bits
  • double: Punto flotante de 64 bits
  • boolean: verdadero o falso
  • char: Carácter Unicode de 16 bits
public class DataTypes {
    public static void main(String[] args) {
        // Tipos enteros
        byte edad = 25;
        short año = 2024;
        int población = 1000000;
        long distancia = 93000000L; // Sufijo L para long
        
        // Tipos de punto flotante
        float temperatura = 36.5f; // Sufijo f para float
        double pi = 3.14159265359;
        
        // Tipos booleano y carácter
        boolean estaActivo = true;
        char calificación = 'A';
        
        // Cadena (tipo de referencia)
        String nombre = "Alicia";
        
        System.out.println("Nombre: " + nombre + ", Edad: " + edad);
    }
}

3.1 Operaciones con cadenas

Las cadenas en Java son objetos, no tipos primitivos:

public class StringExample {
    public static void main(String[] args) {
        String texto = "Programación Java";
        
        System.out.println("Longitud: " + texto.length());
        System.out.println("Mayúsculas: " + texto.toUpperCase());
        System.out.println("Minúsculas: " + texto.toLowerCase());
        System.out.println("Carácter en el índice 0: " + texto.charAt(0));
        System.out.println("Subcadena: " + texto.substring(0, 4));
        System.out.println("Contiene 'Java': " + texto.contains("Java"));
        
        // Concatenación de cadenas
        String saludo = "¡Hola, " + "Mundo!";
        System.out.println(saludo);
        
        // Formato de cadenas
        String formateado = String.format("Pi es aproximadamente %.2f", 3.14159);
        System.out.println(formateado);
    }
}

4. Arreglos y colecciones

4.1 Arreglos

Los arreglos almacenan múltiples valores del mismo tipo:

public class ArrayExample {
    public static void main(String[] args) {
        // Declaración e inicialización de arreglo
        int[] números = {1, 2, 3, 4, 5};
        String[] frutas = new String[3];
        frutas[0] = "manzana";
        frutas[1] = "plátano";
        frutas[2] = "naranja";
        
        // Acceso a elementos del arreglo
        System.out.println("Primer número: " + números[0]);
        System.out.println("Longitud del arreglo: " + números.length);
        
        // Iteración a través de arreglos
        for (int i = 0; i < números.length; i++) {
            System.out.println("Número " + i + ": " + números[i]);
        }
        
        // Bucle for mejorado (for-each)
        for (String fruta : frutas) {
            System.out.println("Fruta: " + fruta);
        }
        
        // Arreglos multidimensionales
        int[][] matriz = {{1, 2}, {3, 4}, {5, 6}};
        System.out.println("Elemento de la matriz [1][1]: " + matriz[1][1]);
    }
}

4.2 Colecciones

El Framework de Colecciones de Java proporciona estructuras de datos dinámicas:

import java.util.*;

public class CollectionsExample {
    public static void main(String[] args) {
        // ArrayList (arreglo dinámico)
        ArrayList<String> nombres = new ArrayList<>();
        nombres.add("Alicia");
        nombres.add("Roberto");
        nombres.add("Carlos");
        nombres.remove("Roberto");
        System.out.println("Nombres: " + nombres);
        
        // HashMap (pares clave-valor)
        HashMap<String, Integer> edades = new HashMap<>();
        edades.put("Alicia", 25);
        edades.put("Roberto", 30);
        edades.put("Carlos", 35);
        System.out.println("Edad de Alicia: " + edades.get("Alicia"));
        
        // HashSet (elementos únicos)
        HashSet<Integer> númerosÚnicos = new HashSet<>();
        númerosÚnicos.add(1);
        númerosÚnicos.add(2);
        númerosÚnicos.add(2); // Duplicado, no se agregará
        númerosÚnicos.add(3);
        System.out.println("Números únicos: " + númerosÚnicos);
        
        // Iteración a través de colecciones
        for (String nombre : nombres) {
            System.out.println("Nombre: " + nombre);
        }
        
        for (Map.Entry<String, Integer> entrada : edades.entrySet()) {
            System.out.println(entrada.getKey() + ": " + entrada.getValue());
        }
    }
}

5. Operadores

Java proporciona varios operadores para diferentes operaciones:

  • Operadores aritméticos: +, -, *, /, % (módulo), ++ (incremento), -- (decremento)
  • Operadores de comparación: ==, !=, >, <, >=, <=
  • Operadores lógicos: && (y), || (o), ! (no)
  • Operadores bit a bit: &, |, ^, ~, <<, >>, >>>
  • Operadores de asignación: =, +=, -=, *=, /=, %=
public class OperatorsExample {
    public static void main(String[] args) {
        int a = 10, b = 3;
        
        // Operaciones aritméticas
        System.out.println("Suma: " + (a + b));
        System.out.println("Resta: " + (a - b));
        System.out.println("Multiplicación: " + (a * b));
        System.out.println("División: " + (a / b));
        System.out.println("Módulo: " + (a % b));
        
        // Incremento y decremento
        System.out.println("Pre-incremento: " + (++a));
        System.out.println("Post-decremento: " + (b--));
        
        // Operaciones de comparación
        System.out.println("Igual: " + (a == b));
        System.out.println("No igual: " + (a != b));
        System.out.println("Mayor que: " + (a > b));
        
        // Operaciones lógicas
        boolean x = true, y = false;
        System.out.println("Y: " + (x && y));
        System.out.println("O: " + (x || y));
        System.out.println("NO: " + (!x));
        
        // Operaciones de asignación
        int c = 5;
        c += 3; // c = c + 3
        System.out.println("Después de += 3: " + c);
    }
}

6. Control de flujo

6.1 Declaraciones condicionales

public class ConditionalExample {
    public static void main(String[] args) {
        int puntuación = 85;
        
        // Declaración if-else
        if (puntuación >= 90) {
            System.out.println("Calificación: A");
        } else if (puntuación >= 80) {
            System.out.println("Calificación: B");
        } else if (puntuación >= 70) {
            System.out.println("Calificación: C");
        } else {
            System.out.println("Calificación: F");
        }
        
        // Operador ternario
        String resultado = (puntuación >= 60) ? "Aprobado" : "Reprobado";
        System.out.println("Resultado: " + resultado);
        
        // Declaración switch
        char calificación = 'B';
        switch (calificación) {
            case 'A':
                System.out.println("¡Excelente!");
                break;
            case 'B':
                System.out.println("¡Bueno!");
                break;
            case 'C':
                System.out.println("Promedio");
                break;
            default:
                System.out.println("Calificación inválida");
        }
    }
}

6.2 Bucles

public class LoopExample {
    public static void main(String[] args) {
        // Bucle for
        System.out.println("Bucle for:");
        for (int i = 0; i < 5; i++) {
            System.out.println("Iteración: " + i);
        }
        
        // Bucle for mejorado (for-each)
        System.out.println("\nBucle for-each:");
        int[] números = {1, 2, 3, 4, 5};
        for (int num : números) {
            System.out.println("Número: " + num);
        }
        
        // Bucle while
        System.out.println("\nBucle while:");
        int contador = 0;
        while (contador < 3) {
            System.out.println("Contador: " + contador);
            contador++;
        }
        
        // Bucle do-while
        System.out.println("\nBucle do-while:");
        int x = 0;
        do {
            System.out.println("X: " + x);
            x++;
        } while (x < 3);
        
        // break y continue
        System.out.println("\nBreak y continue:");
        for (int i = 0; i < 10; i++) {
            if (i == 5) {
                break; // Salir del bucle
            }
            if (i % 2 == 0) {
                continue; // Saltar números pares
            }
            System.out.println("Número impar: " + i);
        }
    }
}

7. Métodos (Funciones)

Los métodos en Java son funciones que pertenecen a las clases:

public class MethodExample {
    
    // Método sin parámetros y sin valor de retorno
    public static void saludar() {
        System.out.println("¡Hola, Mundo!");
    }
    
    // Método con parámetros y valor de retorno
    public static int sumar(int a, int b) {
        return a + b;
    }
    
    // Método con múltiples parámetros
    public static String formatearNombre(String nombre, String apellido) {
        return nombre + " " + apellido;
    }
    
    // Sobrecarga de métodos (mismo nombre, diferentes parámetros)
    public static int multiplicar(int a, int b) {
        return a * b;
    }
    
    public static double multiplicar(double a, double b) {
        return a * b;
    }
    
    // Argumentos variables (varargs)
    public static int suma(int... números) {
        int total = 0;
        for (int num : números) {
            total += num;
        }
        return total;
    }
    
    public static void main(String[] args) {
        saludar();
        
        int resultado = sumar(5, 3);
        System.out.println("Resultado de suma: " + resultado);
        
        String nombreCompleto = formatearNombre("Juan", "Pérez");
        System.out.println("Nombre completo: " + nombreCompleto);
        
        System.out.println("Multiplicar enteros: " + multiplicar(4, 5));
        System.out.println("Multiplicar doubles: " + multiplicar(2.5, 3.0));
        
        System.out.println("Suma de múltiples números: " + suma(1, 2, 3, 4, 5));
    }
}

8. Programación orientada a objetos

8.1 Clases y objetos

public class Persona {
    // Variables de instancia (campos)
    private String nombre;
    private int edad;
    private String email;
    
    // Constructor
    public Persona(String nombre, int edad, String email) {
        this.nombre = nombre;
        this.edad = edad;
        this.email = email;
    }
    
    // Constructor por defecto
    public Persona() {
        this("Desconocido", 0, "");
    }
    
    // Métodos getter
    public String getNombre() {
        return nombre;
    }
    
    public int getEdad() {
        return edad;
    }
    
    public String getEmail() {
        return email;
    }
    
    // Métodos setter
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    
    public void setEdad(int edad) {
        if (edad >= 0) {
            this.edad = edad;
        }
    }
    
    public void setEmail(String email) {
        this.email = email;
    }
    
    // Método de instancia
    public void presentarse() {
        System.out.println("Hola, soy " + nombre + ", tengo " + edad + " años.");
    }
    
    // Método con lógica
    public boolean esAdulto() {
        return edad >= 18;
    }
    
    // Método toString (sobrescribiendo el toString de Object)
    @Override
    public String toString() {
        return "Persona{nombre='" + nombre + "', edad=" + edad + ", email='" + email + "'}";
    }
    
    public static void main(String[] args) {
        // Creando objetos
        Persona persona1 = new Persona("Alicia", 25, "[email protected]");
        Persona persona2 = new Persona();
        
        // Usando métodos
        persona1.presentarse();
        System.out.println("Es adulto: " + persona1.esAdulto());
        
        persona2.setNombre("Roberto");
        persona2.setEdad(17);
        persona2.setEmail("[email protected]");
        
        System.out.println(persona1.toString());
        System.out.println(persona2.toString());
    }
}

Este tutorial completo de Java cubre los conceptos esenciales necesarios para comenzar con la programación en Java. El sistema de tipos fuertes, las características orientadas a objetos y la extensa biblioteca estándar de Java lo hacen poderoso para construir aplicaciones robustas. Practica estos ejemplos y experimenta con el código para profundizar tu comprensión de los conceptos de programación en Java.